package com.powerunion.datacollection.report.excelreport.base.element;

import com.powerunion.datacollection.report.excelreport.base.BaseElement;
import com.powerunion.datacollection.report.excelreport.base.ITempletContainer;
import com.powerunion.datacollection.report.excelreport.impl.Band;
import com.powerunion.datacollection.report.excelreport.impl.Group;
import com.powerunion.datacollection.report.excelreport.util.AnalyseTempletTool;

import jxl.write.WritableCell;
/**
 * Description: 模板元素创建工厂，该类负责根据模板定义创建相应的模板元素对象实例,<br>比如：<br>
 * $F{ds.fieldName1}: 创建一个字段类型实例。对应该变量的数据源名称为ds，字段名为fieldName1。<br>
 * $P{parameterName}: 创建一个参数类型变量实例。对应该变量的参数名为parameterName<br>
 * $
 * @author
 */
public class ElementFactory {
    /**
     * 根据模板文件取得模板元素对应的对象,并初始化该对象元素
     * @param elementTemplet
     * @param container
     * @return
     */
    public BaseElement getElement(WritableCell cell, ITempletContainer container) {
        String elementTemplet = cell.getContents();
        
    	BaseElement element = null;
        if(AnalyseTempletTool.isFieldTemplet(elementTemplet) 
                || AnalyseTempletTool.isArgumentTemplet(elementTemplet)){
            element = new CommonField(container);
        }else if(AnalyseTempletTool.isVariableTemplet(elementTemplet)){
            element = new FormulateField(container);
        }else if(AnalyseTempletTool.isBandTemplet(elementTemplet)){
            element = new Band(container);
        }else if(AnalyseTempletTool.isGroupTemplet(elementTemplet)){
            element = new Group(container);
        }else if(AnalyseTempletTool.isStringFieldTemplet(elementTemplet)){
            element = new StringField(container);
        }
        
        if(null != element){
            element.setElementTempletValue(elementTemplet);
            element.setTempletCellRef(cell);
        }
       
        return element;
    }
    
    /**
     * 取得变量的实例对象
     * @param variable
     * @return
     */
    public static Variable getVariableInstances(String variable){
        StringBuffer content = null;
        //modified by ajun 修改参数变量不能取别名的问题。
        content = new StringBuffer(AnalyseTempletTool.getElementDeclare(variable));
        
        //判断当前传入的变量定义模板是否取了别名
        if(AnalyseTempletTool.haveVariableName(content)){
            //去掉变量命名时外部的修饰符如:$F{{ds.field1} as field1}
            //运行该函数后content内的内容为:ds.field1
            AnalyseTempletTool.getVariableName(content);
        }
        
        if(AnalyseTempletTool.isFieldTemplet(variable)){
            return new FieldVariable(content.toString());
        }
        
        if(AnalyseTempletTool.isArgumentTemplet(variable)){
            return  new ParameterVariable(content.toString());
        }
        
        //默认的都是常量类型变量
        return new ConstantVariable(variable);
    }
    
    /**
     * 取得模板成员创建工厂
     * @return
     */
    public static ElementFactory getFactory(){
        if(null == factory){
            factory = new ElementFactory();
        }
        return factory;
    }
    
    private static ElementFactory factory = null;
    
}